package utils

import (
	"go.uber.org/zap"
	"log"
	"net"
	"strings"
)

// GetFreePort
// @Description: 获取空闲的端口
// @return int
// @return error
func GetFreePort() (int, error) {
	addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
	if err != nil {
		zap.S().Errorw("net.ResolveTCPAddr", "err", err.Error())
		return 0, err
	}
	listen, err := net.ListenTCP("tcp", addr)
	if err != nil {
		zap.S().Errorw("net.ListenTCP", "err", err.Error())
		return 0, err
	}
	defer listen.Close()
	return listen.Addr().(*net.TCPAddr).Port, nil
}

// GetOutboundIP
// @Description: 获取外部IP
// @return string
// @return error
func GetOutboundIP() (string, error) {
	conn, err := net.Dial("udp", "8.8.8.8:80")
	if err != nil {
		return "", err
	}
	defer func(conn net.Conn) {
		err := conn.Close()
		if err != nil {
			log.Fatalln(err)
		}
	}(conn)

	localAddr := conn.LocalAddr().(*net.UDPAddr)
	return strings.Split(localAddr.IP.String(), ":")[0], nil
}
